package com.example.reflection.config.util;

import com.example.reflection.pojo.User;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class ReflectUtil {
    public static void copy(Object object) {
        Object objectCopy = null;
        try {
            //获得对象的类型
            Class<?> classType = object.getClass();
            System.out.println("Class:" + classType.getName());

            //通过默认构造方法创建一个新的对象
            objectCopy = classType.getConstructor(new Class[]{}).newInstance();

            //获得对象的所有属性
            Field[] fields = classType.getDeclaredFields();

            for (Field field : fields) {
                String fieldName = field.getName();
                String firstLetter = fieldName.substring(0, 1).toUpperCase();
                //获得和属性对应的getXXX()方法的名字
                String getMethodName = "get" + firstLetter + fieldName.substring(1);
                //获得和属性对应的setXXX()方法的名字
                String setMethodName = "set" + firstLetter + fieldName.substring(1);

                //获得和属性对应的getXXX()方法
                Method getMethod = classType.getMethod(getMethodName);
                //获得和属性对应的setXXX()方法
                Method setMethod = classType.getMethod(setMethodName, field.getType());

                //调用原对象的getXXX()方法
                Object value = getMethod.invoke(object);
                System.out.println(fieldName + ":" + value);
                //调用拷贝对象的setXXX()方法
                setMethod.invoke(objectCopy, value);
            }
            System.out.println("----------------------------------------");
        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        User user = new User();
        user.setAge(34);
        user.setName("Lisa");
        ReflectUtil.copy(user);
    }
}
